<?php
/* 均值哈希
 * 1.将图片缩小为8*8的尺寸
 * 2.将小图片变为灰度图像
 * 3.计算每个像素的灰度平均值
 * 4.与平均值进行比较，大于等于为 1，小于为 0，得到指纹
 * 5.将两个图片的指纹依次进行比较，相同 count++  count越大，相似度越高
 * */
class ImgCompare{

    public $width = 32;
    public $height = 32;
    public $scalar = 32;

    // 比较相似度  实现步骤5
    public function compare($img1, $img2){

        $hash1 = $this->gethash($img1);
        $hash2 = $this->gethash($img2);
        echo "$hash1\n";
        echo "$hash2\n";
        if(strlen($hash1) !== strlen($hash2)) {
            return false;
        }
        $result = $this->hd($hash1, $hash2);

        //计算相似度
        return $result;

    }

    /**
     * 计算汉明距离
     */
    public function hd($h1, $h2)
    {
        $len = strlen($h1);
        $dist = 0;
        for ($i = 0;$i < $len; $i++) {
            if ( $h1[$i] == $h2[$i] )
                $dist++;
        }
        return $dist;
    }

    // 获得图片指纹
    public function gethash($url){

        $array = array();
        $total = 0;

        /**
         * 新建一个 width * height 真彩色图像
         * 返回一个图像标识符
         */
        $new_img = imagecreatetruecolor($this->width, $this->height);   

        //获取图片宽和高
        list($ex_w, $ex_h) = getimagesize($url);  
        $name = pathinfo($url, PATHINFO_EXTENSION);    // 获得图片文件的后缀名
        $ex_img = call_user_func('imagecreatefrom'. ( $name == 'jpg' ? 'jpeg' : $name ) , $url); //获得图片

        //调整图片尺寸
        imagecopyresampled($new_img, $ex_img, 0, 0, 0, 0, $this->width, $this->height, $ex_w, $ex_h);
        
        //销毁缓存
        imagedestroy($ex_img);   
        
        for($i = 0; $i < $this->scalar; $i++){
            for($j = 0; $j < $this->scalar; $j++){

                /**
                 * 获得每个位置像素的索引值
                 * 0xFF：表示16进制 相当于 十进制 的 255
                 * 1111 1111
                 * 计算图片灰度值
                 */
                $gray = (ImageColorAt($new_img, $j, $i) >> 8) & 255;
                // $r = (ImageColorAt($new_img, $j, $i) >> 16) & 255;
                // $g = (ImageColorAt($new_img, $j, $i) >> 8) & 255;
                // $b = ImageColorAt($new_img, $j, $i) & 255;
                // $gray = (intval(($r + $g + $b) / 3)) & 255;
                $array[$i][$j] = $gray;     // 记录每个点的像素值
                $total += $gray;    // 计算总和
            }
        }
        imagedestroy($new_img);
        $average = intval($total / ( $this->width * $this->height * 2));   // 平均值  实现步骤3
        $hash = '';
        for($i = 0; $i < $this->scalar; $i++){
            for($j = 0; $j < $this->scalar; $j++){
                $hash .= ($array[$i][$j] > $average) ? '1' : '0';    // 实现步骤4
            }
        }
        return$hash;
    }

}

